package start.designpattern.builder;

/**
 * 建造者模式
 *
 * 将 一个复杂对象 的 构建过程 与其 表示 分离 , 使得 同样的构建过程 , 可以 创建不同的表示 ;
 * 用户只需要 指定 需要建造的类型 就可以 得到该类型对应的产品实例 , 不关心建造过程细节 ;
 * 建造者模式就是 如何逐步构建包含多个组件的对象 , 相同的构建过程 , 可以创建不同的产品 ,
 *
 * 与工厂模式对比
 * 创建对象的力度不同 , 建造者模式可以创建复杂的产品 , 由各种复杂的部件组成 , 工厂模式创建出来的都是相同的实例对象 ,
 *
 */

public class Student {

    private String name;

    private int age;

    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }


    public static Student.StudentBuilder builder() {
        return new Student.StudentBuilder();
    }

    private static class StudentBuilder {

        private String name;

        private int age;

        private String sex;

        public Student.StudentBuilder name(String name) {
            this.name = name;
            return this;
        }

        public Student.StudentBuilder age(int age) {
            this.age = age;
            return this;
        }

        public Student.StudentBuilder sex(String sex) {
            this.sex = sex;
            return this;
        }


        public Student build() {
            Student student = new Student();
            student.age = this.age;
            student.name = this.name;
            student.sex = this.sex;

            return student;
        }

    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

    public static void main(String[] args) {
        Student student = Student.builder()
                .age(10)
                .name("张三")
                .sex("男")
                .build();

        System.out.println(student);

    }


}
